package com.fm.base.json;

public interface JsonObject extends JsonStructure, javax.json.JsonObject {
    @Override
    default JsonArray getJsonArray(String key) {
        return (JsonArray) get(key);
    }

    @Override
    default JsonObject getJsonObject(String key) {
        return (JsonObject) get(key);
    }

    @Override
    default JsonNumber getJsonNumber(String key) {
        return (JsonNumber) get(key);
    }

    @Override
    default JsonString getJsonString(String key) {
        return (JsonString) get(key);
    }

    @Override
    default String getString(String key) {
        JsonValue val = (JsonValue) get(key);
        return val == null ? null : val.toString();
    }

    @Override
    default String getString(String key, String defaultValue) {
        JsonValue val = (JsonValue) get(key);
        return val == null ? defaultValue : val.toString();
    }

    @Override
    default int getInt(String key) {
        return getJsonNumber(key).intValue();
    }

    @Override
    default int getInt(String key, int defaultValue) {
        JsonNumber val = (JsonNumber) get(key);
        return val == null ? defaultValue : val.intValue();
    }

    default int getAsInt(String key, int defaultValue) {
        JsonValue val = (JsonValue) get(key);
        return val == null ? defaultValue : (val instanceof JsonNumber ? ((JsonNumber) val).intValue() : Integer.parseInt(val.toString()));
    }

    @Override
    default boolean getBoolean(String key) {
        return getJsonBoolean(key).getBoolean();
    }

    @Override
    default boolean getBoolean(String key, boolean defaultValue) {
        JsonBoolean val = (JsonBoolean) get(key);
        return val == null ? defaultValue : val.getBoolean();
    }

    @Override
    default boolean isNull(String key) {
        return get(key) == null;
    }

    default JsonBoolean getJsonBoolean(String key) {
        return (JsonBoolean) get(key);
    }

    /**
     * @param key   key
     * @param value value
     * @return this
     */
    default JsonObject append(String key, JsonValue value) {
        put(key, value);
        return this;
    }

    JsonObject append(String key, boolean b);

    JsonObject append(String key, int number);

    JsonObject append(String key, long number);

    JsonObject append(String key, double number);

    JsonObject append(String key, Number number);

    JsonObject append(String key, String string);

    void put(String key, boolean b);

    void put(String key, int number);

    void put(String key, long number);

    void put(String key, double number);

    void put(String key, Number number);

    void put(String key, String string);

    @Override
    JsonObject clone();
}
